package tech.aistar.day02.method;

import java.util.Arrays;

/**
 * 本类用来演示: 方法的参数传递的方式
 *
 * @author: success
 * @date: 2021/3/5 3:05 下午
 */
public class ParamTransferDemo {
    public static void main(String[] args) {
        //1 - 基本数据类型
        //原稿
        int a = 10;
        int b = 20;
        //int b = 10;
        //System.out.println(a == b);//true
        add(a,b);
        System.out.println("main - a:"+a);//10
        System.out.println("main - b:"+b);//20

        //2 - 对象类型
        //对象的创建的过程:只要遇到new关键字,就会在JVM的堆区,申请一块空间,空间是用来存储这个对象的具体的数据{1,2,3}
        //然后将这个堆区的空间的内存地址赋值给了引用变量arr1,保存在栈区
        int[] arr1 = new int[]{10,20,30};
        int[] arr2 = new int[]{1,2,3};
        //System.out.println("arr1:"+arr1);//[I@330bedb4
        //System.out.println("arr2:"+arr2);//[I@2503dbd3
        //System.out.println(arr1 == arr2);//false

        //对象类型传递的时候 - 按照引用/地址传递
        //将变量中保存的地址拷贝一份给了方法的参数.
        add(arr1,arr2);

        System.out.println("main arr1 ->"+ Arrays.toString(arr1));//[10,20,30]
        System.out.println("main arr2 ->"+ Arrays.toString(arr2));//[2,3,4]

        //对象类型
        //String虽然是一个对象类型,但是比较特殊,进行参数传递的时候,具有值传递的特性.
        String s2 = new String("good");
        changeString(s2);
        System.out.println("main->s2:"+s2);//good

    }

   public static void changeString(String s2){
        s2+=" java";//s2 = s2 + "java";
       System.out.println("changeString->s2:"+s2);//good java
   }



    public static void add(int[] arr1,int[] arr2){
        arr1 = arr2;//把arr2的值赋值给了arr1

        //整体的代码的功能是干嘛的即可....
        for (int i = 0; i < arr2.length; i++) {
            arr2[i] = arr2[i]+1;
        }

        //输出arr1和arr2
        System.out.println("add arr1 ->"+ Arrays.toString(arr1));//[2,3,4]
        System.out.println("add arr2 ->"+ Arrays.toString(arr2));//[2,3,4]
    }

    public static void add(int a,int b){//副本
        a = a ^ b;
        b = a ^ b;
        a = a ^ b;
        System.out.println("add - a:"+a);//20
        System.out.println("add - b:"+b);//10
    }
}
